/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.mantenimiento</code> agrupa todas las
 * interfaces, clases y elementos de la GUI para la gestión del subsistema 
 * de Mantenimiento
 */
package edu.uoc.tds.pec4.mantenimiento;

import edu.uoc.tds.pec4.rmi.GestorMantenimientoInterface;
import edu.uoc.tds.pec4.beans.AuditoriaDTO;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.RolDTO;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.rmi.GestorConexionInterface;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorConexionException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorMantenimientoException;
import java.awt.Frame;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;

/**
 * La clase <code>DialogConsultaUsuario</code> representa la interfaz de
 * usuario para la consulta, baja y mantenimiento de un usuario.<br />
 *
 * Interficie de usuario para el alta de usuarios.
 *
 * @author	Luis Rivas Mariño
 * @version	10/12/2011
 * @see		edu.uoc.tds.pec4.rmi.GestorMantenimientoInterface
 */
public class DialogConsultaUsuario extends javax.swing.JDialog {

    /** clientConnected Indica si el cliente está conectado al servidor */
    private boolean clientConnected = false;
    /** objRemoto Es el objeto empleado como interfaz en la comunicación RMI */
    private GestorMantenimientoInterface objRemotoMantenimiento = null;
    private GestorConexionInterface objRemotoConexion;
    // Identificador del usuario conectado
    UsuarioDTO usLogeado;
    private String idConectado;

    /** Creates new form DialogConsultaUsuario */
    public DialogConsultaUsuario(java.awt.Frame parent,
            GestorMantenimientoInterface objRemotoMantenimiento, UsuarioDTO usuario, 
            UsuarioDTO usLogeado, boolean modal) {
        super(parent, TDSLanguageUtils.getMessage("mantenimiento.usuario.actualizacion.titulo") + " - " + usuario.getIdUsuario(), modal);
        
        conectarCliente();
        
        initComponents();

        // Obtenemos el id del usuario 
        this.usLogeado=usLogeado;
        idConectado = usLogeado.getIdUsuario();

        //Centramos la ventana en la pantalla
        UtilidadesGUI.centrarVentana(this);
        
        rellenaDatos(usuario);
        
    }

    /** Este método es llamado desde el constructor para 
     *  inicializar el formulario.
     */
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelDatos = new javax.swing.JPanel();
        lblNombre = new javax.swing.JLabel();
        nombre = new javax.swing.JTextField();
        lblApellidos = new javax.swing.JLabel();
        apellidos = new javax.swing.JTextField();
        lblNif = new javax.swing.JLabel();
        nif = new javax.swing.JTextField();
        lblIdUsuario = new javax.swing.JLabel();
        idUsuario = new javax.swing.JTextField();
        lblPsw = new javax.swing.JLabel();
        inactivo = new javax.swing.JCheckBox();
        psw = new javax.swing.JTextField();
        panelContacto = new javax.swing.JPanel();
        lblEmail = new javax.swing.JLabel();
        email = new javax.swing.JTextField();
        lblTelefono = new javax.swing.JLabel();
        telefono = new javax.swing.JTextField();
        movil = new javax.swing.JTextField();
        lblFax = new javax.swing.JLabel();
        fax = new javax.swing.JTextField();
        lblMovil = new javax.swing.JLabel();
        panelRoles = new javax.swing.JPanel();
        rolAdmin = new javax.swing.JCheckBox();
        rolTecn = new javax.swing.JCheckBox();
        rolCliente = new javax.swing.JCheckBox();
        panelDireccion = new javax.swing.JPanel();
        lblDireccion = new javax.swing.JLabel();
        direccion = new javax.swing.JTextField();
        lblCiudad = new javax.swing.JLabel();
        lblCodPostal = new javax.swing.JLabel();
        codPostal = new javax.swing.JTextField();
        ciudad = new javax.swing.JTextField();
        nomCiudad = new javax.swing.JTextField();
        btnCambiar = new javax.swing.JButton();
        panelCC = new javax.swing.JPanel();
        lblCc = new javax.swing.JLabel();
        cc = new javax.swing.JTextField();
        panelBotones = new javax.swing.JPanel();
        btnVolver = new javax.swing.JButton();
        btnBaja = new javax.swing.JButton();
        btnModificacion = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        panelDatos.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Datos generales", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        lblNombre.setText("Nombre:");

        lblApellidos.setText("Apellidos:");

        lblNif.setText("NIF/NIE:");

        lblIdUsuario.setText("Id. Usuario:");

        idUsuario.setEditable(false);
        idUsuario.setFont(new java.awt.Font("Tahoma", 1, 11));

        lblPsw.setText("Contraseña:");

        inactivo.setText("Inactivo");
        inactivo.setEnabled(false);
        inactivo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                inactivoItemStateChanged(evt);
            }
        });

        psw.setHorizontalAlignment(javax.swing.JTextField.CENTER);

        javax.swing.GroupLayout panelDatosLayout = new javax.swing.GroupLayout(panelDatos);
        panelDatos.setLayout(panelDatosLayout);
        panelDatosLayout.setHorizontalGroup(
            panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblIdUsuario)
                    .addComponent(lblNombre)
                    .addComponent(lblApellidos))
                .addGap(14, 14, 14)
                .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(apellidos, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE)
                    .addComponent(nombre, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE)
                    .addComponent(idUsuario, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE))
                .addGap(52, 52, 52)
                .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelDatosLayout.createSequentialGroup()
                        .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lblPsw)
                            .addComponent(lblNif))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(nif)
                            .addComponent(psw, javax.swing.GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE)))
                    .addComponent(inactivo))
                .addGap(65, 65, 65))
        );
        panelDatosLayout.setVerticalGroup(
            panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosLayout.createSequentialGroup()
                .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(nif, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblNif))
                    .addGroup(panelDatosLayout.createSequentialGroup()
                        .addGap(1, 1, 1)
                        .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblIdUsuario)
                            .addComponent(idUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblNombre)
                            .addComponent(nombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblPsw)
                            .addComponent(psw, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(apellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblApellidos)
                    .addComponent(inactivo))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelContacto.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Datos de contacto", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        lblEmail.setText("Correo Electrónico:");

        lblTelefono.setText("Teléfono:");

        lblFax.setText("Fax:");

        lblMovil.setText("Móvil:");

        javax.swing.GroupLayout panelContactoLayout = new javax.swing.GroupLayout(panelContacto);
        panelContacto.setLayout(panelContactoLayout);
        panelContactoLayout.setHorizontalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContactoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblEmail)
                    .addComponent(lblTelefono))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addComponent(telefono, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(33, 33, 33)
                        .addComponent(lblMovil)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(movil, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
                        .addComponent(lblFax)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(fax, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(email, javax.swing.GroupLayout.PREFERRED_SIZE, 385, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelContactoLayout.setVerticalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContactoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(telefono, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblTelefono))
                    .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(movil, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblMovil))
                    .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(fax, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblFax)))
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addGap(9, 9, 9)
                        .addComponent(lblEmail))
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(email, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        panelRoles.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Roles:", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        rolAdmin.setText("Administrador");
        rolAdmin.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                rolAdminItemStateChanged(evt);
            }
        });

        rolTecn.setText("Técnico auxiliar");
        rolTecn.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                rolTecnItemStateChanged(evt);
            }
        });

        rolCliente.setText("Cliente");
        rolCliente.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                rolClienteItemStateChanged(evt);
            }
        });

        javax.swing.GroupLayout panelRolesLayout = new javax.swing.GroupLayout(panelRoles);
        panelRoles.setLayout(panelRolesLayout);
        panelRolesLayout.setHorizontalGroup(
            panelRolesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRolesLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(rolAdmin)
                .addGap(33, 33, 33)
                .addComponent(rolTecn)
                .addGap(40, 40, 40)
                .addComponent(rolCliente)
                .addContainerGap())
        );
        panelRolesLayout.setVerticalGroup(
            panelRolesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRolesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(rolAdmin)
                .addComponent(rolTecn)
                .addComponent(rolCliente))
        );

        panelDireccion.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Dirección", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        lblDireccion.setText("Dirección:");

        direccion.setHorizontalAlignment(javax.swing.JTextField.LEFT);

        lblCiudad.setText("Localidad:");

        lblCodPostal.setText("Cod. Postal:");

        codPostal.setHorizontalAlignment(javax.swing.JTextField.CENTER);

        ciudad.setEnabled(false);

        nomCiudad.setEnabled(false);

        btnCambiar.setText("Cambiar");
        btnCambiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCambiarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelDireccionLayout = new javax.swing.GroupLayout(panelDireccion);
        panelDireccion.setLayout(panelDireccionLayout);
        panelDireccionLayout.setHorizontalGroup(
            panelDireccionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDireccionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDireccionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDireccionLayout.createSequentialGroup()
                        .addComponent(lblDireccion)
                        .addGap(19, 19, 19)
                        .addComponent(direccion, javax.swing.GroupLayout.DEFAULT_SIZE, 415, Short.MAX_VALUE))
                    .addGroup(panelDireccionLayout.createSequentialGroup()
                        .addComponent(lblCiudad)
                        .addGap(18, 18, 18)
                        .addComponent(ciudad, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(nomCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCambiar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 36, Short.MAX_VALUE)
                        .addComponent(lblCodPostal)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(codPostal, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        panelDireccionLayout.setVerticalGroup(
            panelDireccionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDireccionLayout.createSequentialGroup()
                .addGroup(panelDireccionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(direccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblDireccion))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDireccionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCiudad)
                    .addComponent(ciudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(nomCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblCodPostal)
                    .addComponent(codPostal, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnCambiar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelCC.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Forma de pago", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        lblCc.setText("Cuenta corriente:");

        javax.swing.GroupLayout panelCCLayout = new javax.swing.GroupLayout(panelCC);
        panelCC.setLayout(panelCCLayout);
        panelCCLayout.setHorizontalGroup(
            panelCCLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCCLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblCc)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(cc, javax.swing.GroupLayout.PREFERRED_SIZE, 383, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(13, Short.MAX_VALUE))
        );
        panelCCLayout.setVerticalGroup(
            panelCCLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCCLayout.createSequentialGroup()
                .addGroup(panelCCLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblCc))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        btnVolver.setText("Volver");
        btnVolver.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVolverActionPerformed(evt);
            }
        });

        btnBaja.setText("Activar / Desactivar");
        btnBaja.setEnabled(false);
        btnBaja.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBajaActionPerformed(evt);
            }
        });

        btnModificacion.setText("Modificación");
        btnModificacion.setEnabled(false);
        btnModificacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificacionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelBotonesLayout = new javax.swing.GroupLayout(panelBotones);
        panelBotones.setLayout(panelBotonesLayout);
        panelBotonesLayout.setHorizontalGroup(
            panelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBotonesLayout.createSequentialGroup()
                .addGap(37, 37, 37)
                .addComponent(btnBaja)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnModificacion)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 183, Short.MAX_VALUE)
                .addComponent(btnVolver)
                .addContainerGap())
        );
        panelBotonesLayout.setVerticalGroup(
            panelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBotonesLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(panelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnVolver)
                    .addComponent(btnModificacion)
                    .addComponent(btnBaja))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(95, Short.MAX_VALUE)
                .addComponent(panelRoles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(92, 92, 92))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(panelBotones, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelCC, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelDireccion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelContacto, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelDatos, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelDatos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelRoles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelDireccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelCC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelBotones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void rolAdminItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_rolAdminItemStateChanged
        /* Rol Administrador seleccionado.  
         * Activa rol Tecnico y desactiva y deselecciona rol Cliente
         */
        if (rolAdmin.isSelected()) {
            rolCliente.setEnabled(false);
            rolCliente.setSelected(false);
            rolTecn.setEnabled(true);
            panelCC.setVisible(false);
        } else if (!rolTecn.isSelected()) {
            rolCliente.setEnabled(true);
            panelCC.setVisible(true);
        }
    }//GEN-LAST:event_rolAdminItemStateChanged
    
    private void rolTecnItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_rolTecnItemStateChanged
        /* Rol Tecnico seleccionado.  
         * Activa rol Administrador y desactiva y deselecciona rol Cliente
         */
        if (rolTecn.isSelected()) {
            rolCliente.setEnabled(false);
            rolCliente.setSelected(false);
            rolAdmin.setEnabled(true);
            panelCC.setVisible(false);
        } else if (!rolAdmin.isSelected()) {
            rolCliente.setEnabled(true);
            panelCC.setVisible(true);
        }
    }//GEN-LAST:event_rolTecnItemStateChanged
    
        private void rolClienteItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_rolClienteItemStateChanged
            /* Rol Cliente seleccionado.  
             * Desactiva y deselecciona rol Administrador y rol Tecnico
             */
            if (rolCliente.isSelected()) {
                rolAdmin.setEnabled(false);
                rolAdmin.setSelected(false);
                rolTecn.setEnabled(false);
                rolTecn.setSelected(false);
                panelCC.setVisible(true);
            } else {
                rolAdmin.setEnabled(true);
                rolTecn.setEnabled(true);
                panelCC.setVisible(false);
            }
    }//GEN-LAST:event_rolClienteItemStateChanged
    
    private void btnVolverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVolverActionPerformed
        dispose();
    }//GEN-LAST:event_btnVolverActionPerformed
    
    private void btnCambiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCambiarActionPerformed
        Frame frame = JOptionPane.getFrameForComponent(this);
        DialogLocalidad dlgLocalidad = new DialogLocalidad(frame, true, usLogeado);
        dlgLocalidad.setVisible(true);
        CiudadDTO ciudadBuscada = dlgLocalidad.getCiudad();
        ciudad.setText(String.valueOf(ciudadBuscada.getIdCiudad()));
        nomCiudad.setText(ciudadBuscada.getNomCiudad());
    }//GEN-LAST:event_btnCambiarActionPerformed
    
    private void btnBajaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBajaActionPerformed
        AuditoriaDTO auditoria = new AuditoriaDTO();
        try {
            
            if (inactivo.isSelected()) {
                // Damos de baja lógica al usuario
                
                objRemotoMantenimiento.bajaUsuario(idUsuario.getText());
                
                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.usuario.baja.correcta"));
                
                auditaModificacion(Constantes.BAJA);
                
            } else {
                //Reactivamos el usuario
                objRemotoMantenimiento.activaUsuario(idUsuario.getText());

                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.usuario.altalogica.correcta"));

                auditaModificacion(Constantes.ALTA);
            }
            dispose();
            
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.usuario.baja"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (GestorMantenimientoException gmE) {
            JOptionPane.showMessageDialog(null,
                    gmE.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.usuario.baja"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnBajaActionPerformed
    
    private void btnModificacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificacionActionPerformed
        
        try {
            AuditoriaDTO auditoria = new AuditoriaDTO();
            UsuarioDTO usuario = new UsuarioDTO();
            
            usuario.setIdUsuario(idUsuario.getText());
            usuario.setNIF(nif.getText());
            usuario.setPassword(psw.getText());
            usuario.setNomUsuario(nombre.getText());
            usuario.setApellidos(apellidos.getText());
            usuario.setDomicilio(direccion.getText());
            usuario.setIdCiudad(Integer.parseInt(ciudad.getText()));
            usuario.setCodPostal(codPostal.getText());
            usuario.setTelefono(telefono.getText());
            usuario.setMovil(movil.getText());
            usuario.setFax(fax.getText());
            usuario.setEMail(email.getText());
            if (inactivo.isSelected()) {
                usuario.setInactivo(Constantes.INACTIVO);
            } else {
                usuario.setInactivo(Constantes.ACTIVO);
            }
            
            auditoria.setObjeto(Constantes.USUARIO);
            auditoria.setSujeto(idConectado);
            auditoria.setPk(usuario.getIdUsuario());
            auditoria.setOperacion(Constantes.MODIFICACION);

            // Comprueba si los roles seleccionados están asignados ya o no
            // Si no están asignados, se asignan al usuario
            // Si no está seleccionado el rol y está asignado al usuario 
            // en la base de datos se desasigna
            if (rolTecn.isSelected()) {
                if (!objRemotoMantenimiento.rolUsuario(idUsuario.getText(), Constantes.ROL_TECNICO)) {
                    objRemotoMantenimiento.usuarioRol(idUsuario.getText(), Constantes.ROL_TECNICO);
                    objRemotoMantenimiento.bajaRol(idUsuario.getText(), Constantes.ROL_CLIENTE);
                }
            } else if (objRemotoMantenimiento.rolUsuario(idUsuario.getText(), Constantes.ROL_TECNICO)) {
                objRemotoMantenimiento.bajaRol(idUsuario.getText(), Constantes.ROL_TECNICO);
            }
            
            if (rolCliente.isSelected()) {
                
                objRemotoMantenimiento.ccCliente(cc.getText(), idUsuario.getText());
                
                if (!objRemotoMantenimiento.rolUsuario(idUsuario.getText(), Constantes.ROL_CLIENTE)) {
                    objRemotoMantenimiento.usuarioRol(idUsuario.getText(), Constantes.ROL_CLIENTE);
                    objRemotoMantenimiento.bajaRol(idUsuario.getText(), Constantes.ROL_TECNICO);
                    objRemotoMantenimiento.bajaRol(idUsuario.getText(), Constantes.ROL_ADMINISTRADOR);
                }
            } else if (objRemotoMantenimiento.rolUsuario(idUsuario.getText(), Constantes.ROL_CLIENTE)) {
                objRemotoMantenimiento.bajaRol(idUsuario.getText(), Constantes.ROL_CLIENTE);
            }
            
            if (rolAdmin.isSelected()) {
                if (!objRemotoMantenimiento.rolUsuario(idUsuario.getText(), Constantes.ROL_ADMINISTRADOR)) {
                    objRemotoMantenimiento.usuarioRol(idUsuario.getText(), Constantes.ROL_ADMINISTRADOR);
                }
            } else if (objRemotoMantenimiento.rolUsuario(idUsuario.getText(), Constantes.ROL_ADMINISTRADOR)) {
                objRemotoMantenimiento.bajaRol(idUsuario.getText(), Constantes.ROL_ADMINISTRADOR);
            }

            // Si no se ha seleccionado ningún rol, no realizará la modificación del usuario
            if ((rolAdmin.isSelected() || rolTecn.isSelected() || rolCliente.isSelected())) {
                
                objRemotoMantenimiento.modificaUsuario(usuario);
                objRemotoMantenimiento.altaAuditoria(auditoria);
                
                JOptionPane.showMessageDialog(
                        null, TDSLanguageUtils.getMessage("mantenimiento.usuario.modificacion.correcta"));
                dispose();
                
            } else {
                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.usuario.alta.err.sinroles"));
            }
            
        } catch (GestorMantenimientoException gmE) {
            JOptionPane.showMessageDialog(null,
                    gmE.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.usuario.modificacion"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException rE) {
            JOptionPane.showMessageDialog(null,
                    rE.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.usuario.modificacion"),
                    JOptionPane.ERROR_MESSAGE);
        }
        
        
    }//GEN-LAST:event_btnModificacionActionPerformed

    private void inactivoItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_inactivoItemStateChanged

        btnBaja.setEnabled(true);
        btnModificacion.setEnabled(false);

    }//GEN-LAST:event_inactivoItemStateChanged

    /**
     * Realiza la auditoría de movimientos de modificación de datos de
     * equipamiento
     */
    private void auditaModificacion(String operacion) {
        
        AuditoriaDTO auditoria = new AuditoriaDTO();
        
        try {
            auditoria.setObjeto(Constantes.EQUIPAMIENTO);
            auditoria.setSujeto(idConectado);
            auditoria.setPk(idUsuario.getText());
            auditoria.setOperacion(operacion);
            
            objRemotoMantenimiento.altaAuditoria(auditoria);
        } catch (GestorMantenimientoException gmE) {
            JOptionPane.showMessageDialog(null,
                    gmE.getMessage(), TDSLanguageUtils.getMessage("auditoria.usuario.err.modificacion"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException rE) {
            JOptionPane.showMessageDialog(null,
                    rE.getMessage(), TDSLanguageUtils.getMessage("auditoria.usuario.err.modificacion"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Conectar con el servidor RMI
     * Permitela conexion con el servidor RMI
     */
    private void conectarCliente() {
        try {
            objRemotoMantenimiento = (GestorMantenimientoInterface) Naming.lookup("GestorMantenimiento");
            objRemotoConexion = (GestorConexionInterface) Naming.lookup("GestorInterface");
            clientConnected = true;
        } catch (NotBoundException eNbe) {
            objRemotoMantenimiento = null;
            objRemotoConexion = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.notbound") + "\n" + eNbe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            objRemotoMantenimiento = null;
            objRemotoConexion = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.url") + "\n" + eRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (MalformedURLException eMULRe) {
            objRemotoMantenimiento = null;
            objRemotoConexion = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eMULRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            objRemotoMantenimiento = null;
            objRemotoConexion = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eE.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Deshabilita los controles del formulario
     */
    private void deshabilitaControles() {
        idUsuario.setEditable(false);
        ciudad.setEditable(false);
        nomCiudad.setEditable(false);
    }
    
    private void rellenaDatos(UsuarioDTO usuario) {
        //Obtenemos los datos del usuario
        idUsuario.setText(usuario.getIdUsuario());
        nombre.setText(usuario.getNomUsuario());
        apellidos.setText(usuario.getApellidos());
        if (usuario.getInactivo() == Constantes.INACTIVO) {
            inactivo.setSelected(true);
            inactivo.setEnabled(true);
            btnBaja.setEnabled(false);
        } else if (usuario.getInactivo() == Constantes.ACTIVO) {
            inactivo.setEnabled(true);
            inactivo.setSelected(false);
            btnBaja.setEnabled(true);
        }
        psw.setText(usuario.getPassword());
        nif.setText(usuario.getNIF());
        direccion.setText(usuario.getDomicilio());
        ciudad.setText(usuario.getIdCiudad().toString());
        nomCiudad.setText(usuario.getNomCiudad());
        codPostal.setText(usuario.getCodPostal());
        telefono.setText(usuario.getTelefono());
        movil.setText(usuario.getMovil());
        fax.setText(usuario.getFax());
        email.setText(usuario.getEMail());

        // Establecemos los roles autorizados del usuario consultado
        Iterator<RolDTO> it = consultaRoles(objRemotoConexion).iterator();
        while (it.hasNext()) {
            switch (it.next().getIdRol()) {
                //            Tecnico
                case 1:
                    rolTecn.setEnabled(true);
                    rolTecn.setSelected(true);
                    rolAdmin.setEnabled(true);
                    rolCliente.setEnabled(false);
                    panelCC.setVisible(false);
                    panelCC.setEnabled(false);
                    break;
                //             Cliente
                case 2:
                    rolCliente.setEnabled(true);
                    rolCliente.setSelected(true);
                    rolTecn.setEnabled(false);
                    rolAdmin.setEnabled(false);
                    panelCC.setVisible(true);
                    panelCC.setEnabled(true);
                    cc.setText(usuario.getCC());
                    break;
                //            Administrador
                case 3:
                    rolAdmin.setEnabled(true);
                    rolAdmin.setSelected(true);
                    rolTecn.setEnabled(true);
                    rolCliente.setEnabled(false);
                    panelCC.setVisible(false);
                    panelCC.setEnabled(false);
                    break;
            }
        }
        btnModificacion.setEnabled(true);
    }

    /**
     * Obtiene los roles autorizados al usuario conectado
     * @param objRemotoConexion
     * @return roles La lista de roles autorizados al usuario conectado
     */
    private List<RolDTO> consultaRoles(GestorConexionInterface objRemotoConexion) {
        List<RolDTO> roles = new ArrayList<RolDTO>();
        try {
            roles = objRemotoConexion.consultarRoles(idUsuario.getText());
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.usuario.roles"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (GestorConexionException eCe) {
            JOptionPane.showMessageDialog(null,
                    eCe.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.usuario.roles"),
                    JOptionPane.ERROR_MESSAGE);
        }
        return roles;
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField apellidos;
    private javax.swing.JButton btnBaja;
    private javax.swing.JButton btnCambiar;
    private javax.swing.JButton btnModificacion;
    private javax.swing.JButton btnVolver;
    private javax.swing.JTextField cc;
    private javax.swing.JTextField ciudad;
    private javax.swing.JTextField codPostal;
    private javax.swing.JTextField direccion;
    private javax.swing.JTextField email;
    private javax.swing.JTextField fax;
    private javax.swing.JTextField idUsuario;
    private javax.swing.JCheckBox inactivo;
    private javax.swing.JLabel lblApellidos;
    private javax.swing.JLabel lblCc;
    private javax.swing.JLabel lblCiudad;
    private javax.swing.JLabel lblCodPostal;
    private javax.swing.JLabel lblDireccion;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblFax;
    private javax.swing.JLabel lblIdUsuario;
    private javax.swing.JLabel lblMovil;
    private javax.swing.JLabel lblNif;
    private javax.swing.JLabel lblNombre;
    private javax.swing.JLabel lblPsw;
    private javax.swing.JLabel lblTelefono;
    private javax.swing.JTextField movil;
    private javax.swing.JTextField nif;
    private javax.swing.JTextField nomCiudad;
    private javax.swing.JTextField nombre;
    private javax.swing.JPanel panelBotones;
    private javax.swing.JPanel panelCC;
    private javax.swing.JPanel panelContacto;
    private javax.swing.JPanel panelDatos;
    private javax.swing.JPanel panelDireccion;
    private javax.swing.JPanel panelRoles;
    private javax.swing.JTextField psw;
    private javax.swing.JCheckBox rolAdmin;
    private javax.swing.JCheckBox rolCliente;
    private javax.swing.JCheckBox rolTecn;
    private javax.swing.JTextField telefono;
    // End of variables declaration//GEN-END:variables
}
